文章同步發表至 Medium
DotSpatial 是第一個登場的處理 Shapefile 套件,是我第一個在職場中接觸到的套件,也是我到目前為止還有疑惑還沒釐清的套件。
之所以在有疑問的情況下還是選擇介紹這個套件的原因,除了能處理 Shapefile 的套件本來就不多之外,也有可能會遇到像我一樣的情況,舊有的專案需要使用這個套件進行維護,所以最後還是選擇納入這次文章的範圍。
DotSpatial 在他的 GitGub 上有特別說明:
DotSpatial is a geographic information system library written for .NET Framework.
因此只有這個套件的範例不是使用 .NET 6 來撰寫。另外要注意的是,除了主要的DotSpatial.Data
之外,其餘套件有些在預設安裝的時候不會選擇 1.9.0 的版本,之前有遇到過版次不一導致功能出現一些問題,這時候可以試試看升版能不能解決。
套件 | 版本 | 備註 |
---|---|---|
DotSpatial.Data | 1.9.0 | 相依於其他四個套件 |
DotSpatial.Projections | 1.9.0 | |
DotSpatial.Serialization | 1.9.0 | |
DotSpatial.Mono | 1.9.0 | |
DotSpatial.Topology | 1.9.0 |
var shpPath = "test.shp";
var columnInfo = new Dictionary<int, string>();
var shapefile = Shapefile.OpenFile(shpPath);
var fields = shapefile.Attributes.Columns;
for (var i = 0; i < fields.Count; i++)
{
// 列出所有欄位名稱
var field = fields[i];
columnInfo.Add(i, field.ColumnName);
}
var feature = shapefile.Features.FirstOrDefault();
var data = feature.DataRow.ItemArray;
for (var i = 0; i < data.Length; i++)
{
// 取得所有的值
if (string.IsNullOrEmpty(data[i].ToString())) continue;
Console.WriteLine($"{columnInfo[i],-11}:{data[i]}");
}
// 取得類型和 WKT
Console.WriteLine($"{feature.GeometryType,-11}:{feature.BasicGeometry.ToString()}");
就像前一篇所介紹的,需要先找到 Feature
才能取得資料。讀取完成的結果如下圖: